%{
#include <stdio.h>
%}

%token T_PROGRAMA
%token T_INTEIRO
%token T_ESCREVA
%token T_TEXTO
%token T_INICIO
%token T_FIM
%token T_IDENTIFICADOR
%token T_VAR
%token T_DELIMITADOR
%token T_PARENTESES_A
%token T_PARENTESES_F
%token T_VIRGULA
%token T_CONST_INTEIRA 
%token T_CONST_REAL
%token T_CONSTANTE
%token T_IGUAL
%token T_PONTO_VIRGULA

%start programa
%%
vazio:
	;

programa:
	cabecalho-programa T_PONTO_VIRGULA bloco-programa  
	;
cabecalho-programa:
	T_PROGRAMA nome-programa T_PARENTESES_A parametro repeticao-parametro "T_PARENTESES_F"
	;

repeticao-parametro:
	/*vazio*/ | T_VIRGULA parametro repeticao-parametro
	;

bloco-programa:
	bloco
	;

nome-programa:
	T_IDENTIFICADOR
	;

parametro:
	T_IDENTIFICADOR
	;

bloco:
	parte-definicao-constantes/* parte-definicao-tipos parte-definicao-variaveis (declaracao-procedimentos | declaracao-funcoes)* parte-instrucoes*/
	;
	
parte-definicao-constantes:
	vazio | T_CONSTANTE definicao-constante repeticao-definicao-constante
	;

repeticao-definicao-constante:
	/*vazio*/ | T_PONTO_VIRGULA definicao-constante repeticao-definicao-constante
	;
	
definicao-constante:
	T_IDENTIFICADOR T_IGUAL constante
	;

/*Simplificamos esta regra da gramatica pois na definicao de constante no Flex
possui o operador "?" no <sinal>*/
constante:
	T_CONST_INTEIRA | T_CONST_REAL | identificador-constante | T_TEXTO
	;

identificador-constante:
	T_IDENTIFICADOR
	;

/*
corpo:
	T_INICIO
	lista_instrucao
	T_FIM
	T_DELIMITADOR
	; 
	
lista_instrucao:
	T_ESCREVA T_DELIMITADOR T_TEXTO T_DELIMITADOR
	T_DELIMITADOR
	;
*/
%%

int yyerror(char *s) {
	printf("yyerror %s\n", s);
}

int main() {
	yyparse();
}
